// GlobalSearchController.java
package com.geek.hero.controller;

import com.geek.hero.entity.Bond;
import com.geek.hero.entity.Equip;
import com.geek.hero.entity.Heros;
import com.geek.hero.entity.HerosBond;
import com.geek.hero.entity.Rune;
import com.geek.hero.result.Result;
import com.geek.hero.service.IBondService;
import com.geek.hero.service.IEquipService;
import com.geek.hero.service.IHerosBondService;
import com.geek.hero.service.IHerosService;
import com.geek.hero.service.IRuneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 全局搜索控制器
 * 提供跨多种游戏元素的统一搜索功能
 */
@RestController
@RequestMapping("/search")
@CrossOrigin
public class GlobalSearchController {

    // 注入英雄服务
    @Autowired
    private IHerosService herosService;

    // 注入装备服务
    @Autowired
    private IEquipService equipService;

    // 注入羁绊服务
    @Autowired
    private IBondService bondService;

    // 注入符文服务
    @Autowired
    private IRuneService runeService;

    // 注入英雄羁绊关系服务
    @Autowired
    private IHerosBondService herosBondService;

    /**
     * 全局搜索接口
     * 根据关键字在英雄、装备、羁绊、符文等数据中进行搜索
     * 请求路径: GET /search?keyword=关键字
     * @param keyword 搜索关键字
     * @return Result 包含各类游戏元素的搜索结果
     */
    @GetMapping
    public Result globalSearch(@RequestParam String keyword) {
        // 创建用于存储各类搜索结果的Map
        Map<String, Object> result = new HashMap<>();

        // 搜索英雄 - 根据英雄名称搜索匹配的英雄
        List<Heros> herosList = herosService.searchByName(keyword);
        result.put("heros", herosList);

        // 搜索装备 - 根据装备名称搜索匹配的装备
        List<Equip> equipList = equipService.searchByName(keyword);
        result.put("equip", equipList);

        // 搜索羁绊 - 根据羁绊名称搜索匹配的羁绊
        List<Bond> bondList = bondService.searchByName(keyword);

        // 为羁绊搜索结果添加详细信息，包括与羁绊相关的英雄信息
        List<Map<String, Object>> bondDetailsList = new ArrayList<>();
        for (Bond bond : bondList) {
            // 搜索与该羁绊相关的英雄关系，并且关系名称也要匹配关键字
            List<HerosBond> herosBonds = herosBondService.list(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<HerosBond>()
                            .eq("bond_id", bond.getId())  // 筛选指定羁绊ID的关系
                            .like("name", keyword)  // 关系名称也要匹配关键字
            );

            // 为每个关系获取完整英雄信息
            List<Map<String, Object>> herosWithDetails = new ArrayList<>();
            for (HerosBond hb : herosBonds) {
                Map<String, Object> heroDetail = new HashMap<>();
                heroDetail.put("relationName", hb.getName());  // 关系名称

                // 获取完整英雄信息
                Heros hero = herosService.getById(hb.getHeroId());
                heroDetail.put("heroDetail", hero);  // 英雄详细信息

                herosWithDetails.add(heroDetail);
            }

            // 构造包含详细信息的结果
            Map<String, Object> bondDetail = new HashMap<>();
            bondDetail.put("bondInfo", bond);  // 羁绊基本信息
            bondDetail.put("heros", herosWithDetails);  // 与该羁绊相关的英雄列表

            bondDetailsList.add(bondDetail);
        }

        result.put("bond", bondDetailsList);

        // 搜索符文 - 根据符文名称搜索匹配的符文
        List<Rune> runeList = runeService.searchByName(keyword);
        result.put("rune", runeList);

        // 返回包含所有搜索结果的成功响应
        return new Result(true, "搜索完成", result);
    }
}
